package com.xuecheng.message.sdk.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.xuecheng.message.sdk.model.po.MqMessage;

import java.util.List;

/**
 * <p>
 * 服务类
 * </p>
 *
 * @author itcast
 * @since 2022-09-21
 */
public interface IMqMessageService extends IService<MqMessage>{

    /**
     * 根据分片获取要处理的消息列表
     *
     * @param shardIndex  分片索引
     * @param shardTotal  分片总数
     * @param messageType 消息类型
     * @param count       每次获取消息的数量
     * @return List<MqMessage> 消息列表
     */
    List<MqMessage> getMessageList(int shardIndex, int shardTotal, String messageType, int count);

    /**
     * 添加消息
     *
     * @param messageType  消息类型
     * @param businessKey1 关联业务信息1
     * @param businessKey2 关联业务信息2
     * @param businessKey3 关联业务信息3
     * @return 消息
     */
    MqMessage addMessage(String messageType, String businessKey1, String businessKey2, String businessKey3);

    /**
     * 完成消息阶段1
     *
     * @param id 消息id
     * @return 完成任务：1，未完成任务：0
     */
    void completedStageOne(long id);

    /**
     * 完成消息阶段2
     *
     * @param id 消息id
     * @return 完成任务：1，未完成任务：0
     */
    void completedStageTwo(long id);

    /**
     * 完成消息阶段3
     *
     * @param id 消息id
     * @return 完成任务：1，未完成任务：0
     */
    void completedStageThree(long id);

    /**
     * 完成消息阶段4
     *
     * @param id 消息id
     * @return 完成任务：1，未完成任务：0
     */
    void completedStageFour(long id);

    /**
     * 获取消息阶段1
     *
     * @param id 消息id
     * @return 阶段一完成：1，未完成：0
     */
    int getStageOne(long id);

    /**
     * 获取消息阶段2
     *
     * @param id 消息id
     * @return 阶段二完成：1，未完成：0
     */
    int getStageTwo(long id);

    /**
     * 获取消息阶段3
     *
     * @param id 消息id
     * @return 阶段三完成：1，未完成：0
     */
    int getStageThree(long id);

    /**
     * 获取消息阶段4
     *
     * @param id 消息id
     * @return 阶段四完成：1，未完成：0
     */
    int getStageFour(long id);

    /**
     * 消息处理成功
     *
     * @param id 消息id
     */
    void success(Long id);

    /**
     * 消息处理失败
     *
     * @param id          消息id
     * @param failureMsg  失败原因
     */
    int fail(long id, String failureMsg);
}
